package br.com.vti.leilao.view.bean;

import br.com.vti.leilao.model.business.Business;
import br.com.vti.leilao.model.business.exception.ApplicationException;
import br.com.vti.leilao.model.entity.Model;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Interface utilizada pelos beans do projeto.
 * 
 * @author Ednardo Rubens
 *
 * @param <E> entidade extends Model
 * @param <X> exceção extends Exception 
 * 
 */
public interface Bean<E extends Model<? extends Number>, X extends ApplicationException> extends Serializable {

    /**
     * Retorna a entidade utilizada pelo managed bean
     * @return entidade
     */
    E getEntidade();

    /**
     * Seta a entidade utilizada pelo managed bean
     * @param entidade Entidade
     */
    void setEntidade(E entidade);

    /**
     * Retorna o business utilizada pelo managed bean
     * @return business
     */
    Business<E, X> getBusiness();

    /**
     * Seta o business utilizada pelo managed bean
     * @param business
     */
    void setBusiness(Business<E, X> business);

    /**
     * Retorna a entidade utilizada pelo managed bean para realizar buscas
     * @return entidadePesquisa entidade de busca
     */
    E getEntidadePesquisa();

    /**
     * Seta a entidade utilizada pelo managed bean para realizar buscas
     * @param entidadePesquisa entidade de busca
     */
    void setEntidadePesquisa(E entidadePesquisa);

    /**
     * Retorna uma lista de entidades
     * @return lista de entidades
     */
    List<E> getListaEntidade();

    /**
     * Seta uma lista de entidades
     * @param listaEntidade lista de entidades
     */
    void setListaEntidade(List<E> listaEntidade);

    /**
     * Retorna uma mapa de entidades para ser utilizada num selectOneMenu
     * @return mapa de entidades
     */
    Map<String, Object> getAllSelectItems();

    /**
     * Salva ou atualiza a entidade no banco
     */
    void salvar();

    /**
     * Remove a entidade do banco
     */
    void remover();

    /**
     * Busca a entidade de busca(entitySearch) no banco e seta em entidade
     */
    void buscar();

    /**
     * Busca uma lista de entidades no banco e seta em ListaEntidade
     */
    void listar();

    /**
     * Limpa os atributos do bean
     */
    void limpar();
}